package 数组系列;

public class MinSubArrayLen {
    //暴力算法
//    public int minSubArrayLen(int target, int[] nums) {
//        int n = nums.length;
//        int min = n;    //初始最小长度设为n
//        boolean flag = false;   //用于标志是否存在长度大于target的子数组
//        for(int i = 0; i < n; i++)
//        {
//
//            int sum = 0;    //子数组的和
//            int temp = 0;   //子数组的长度
//            for(int j = i; j < n; j++)
//            {
//                sum += nums[j];
//                if(sum < target)
//                {
//                    temp++; //如果子数组的和小于temp，长度++
//                }
//                else        //如果子数组的和大于temp
//                {
//                    flag = true;    //标志位为true
//                    temp++;         //长度++
//                    break;          //退出第二层循环
//                }
//            }
//            //System.out.println(sum);  //debug
//            if(sum>=target && temp < min)   //如果子数组的和大于target且长度小于当前最小子数组
//            {
//                min = temp;     //则min = target
//            }
//        }
//        return flag ? min : 0;  //如果存在长度大于target的子数组，则返回min，否则返回0
//    }
    public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;    //初始最小长度设为n
        int left = 0;   //滑动窗口起始位置
        int sum = 0;
        for(int right = 0; right < nums.length; right++){
            sum += nums[right];
            while (sum >= target){
                result = Math.min(result,right - left + 1);//比较滑动窗口和当前最小子数组的长度
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

